import CryptoJS from 'crypto-js'

/**
 * 科大讯飞TTS API工具类
 */

// API配置
export const API_CONFIG = {
  APPID: 'e1368e37',
  API_SECRET: 'MzFiNTQyOTY1YTE0MGMyZGZiZjU1ZGEz',
  API_KEY: '5766eeab8a200267691c5b695b45c2fe',
  HOST_URL: 'wss://tts-api.xfyun.cn/v2/tts'
}

/**
 * 生成WebSocket认证URL
 * @returns {string} 带认证信息的WebSocket URL
 */
export function generateAuthUrl() {
  const url = new URL(API_CONFIG.HOST_URL)
  const host = url.host
  const path = url.pathname
  
  // 生成RFC1123格式的时间戳
  const date = new Date().toUTCString()
  
  // 生成签名字符串
  const signatureOrigin = `host: ${host}\ndate: ${date}\nGET ${path} HTTP/1.1`
  
  // 进行hmac-sha256编码并转base64
  const signatureSha = CryptoJS.HmacSHA256(signatureOrigin, API_CONFIG.API_SECRET)
  const signature = CryptoJS.enc.Base64.stringify(signatureSha)
  
  // 生成authorization参数
  const authorizationOrigin = `api_key="${API_CONFIG.API_KEY}", algorithm="hmac-sha256", headers="host date request-line", signature="${signature}"`
  const authorization = btoa(authorizationOrigin)
  
  // 构建完整的WebSocket URL
  const authUrl = `${API_CONFIG.HOST_URL}?authorization=${authorization}&date=${encodeURIComponent(date)}&host=${host}`
  
  return authUrl
}

/**
 * 生成TTS请求参数
 * @param {Object} options - 配置选项
 * @param {string} options.text - 要合成的文本
 * @param {string} options.voice - 发音人，默认'xiaoyan'
 * @param {number} options.speed - 语速(0-100)，默认50
 * @param {number} options.volume - 音量(0-100)，默认50
 * @param {number} options.pitch - 音调(0-100)，默认50
 * @param {string} options.audioFormat - 音频格式，默认'raw'
 * @returns {Object} TTS请求参数对象
 */
export function generateTtsParams(options = {}) {
  const {
    text,
    voice = 'xiaoyan',
    speed = 50,
    volume = 50,
    pitch = 50,
    audioFormat = 'raw'
  } = options
  
  if (!text) {
    throw new Error('文本内容不能为空')
  }
  
  // 验证参数范围
  if (speed < 0 || speed > 100) {
    throw new Error('语速参数超出范围(0-100)')
  }
  if (volume < 0 || volume > 100) {
    throw new Error('音量参数超出范围(0-100)')
  }
  if (pitch < 0 || pitch > 100) {
    throw new Error('音调参数超出范围(0-100)')
  }
  
  const businessParams = {
    aue: audioFormat,         // 音频编码格式
    auf: 'audio/L16;rate=16000', // 音频采样率
    vcn: voice,               // 发音人
    speed: speed,             // 语速
    volume: volume,           // 音量
    pitch: pitch,             // 音调
    bgs: 0,                   // 合成音频的背景音
    tte: 'UTF8'              // 文本编码格式
  }
  
  // 当使用mp3格式时，需要添加sfl=1参数开启流式返回
  if (audioFormat === 'lame') {
    businessParams.sfl = 1
  }
  
  return {
    common: {
      app_id: API_CONFIG.APPID
    },
    business: businessParams,
    data: {
      status: 2,                // 数据状态，固定为2
      text: btoa(unescape(encodeURIComponent(text))) // base64编码的文本
    }
  }
}

/**
 * 发音人配置 - 仅保留小月粤语发音人
 */
export const VOICE_OPTIONS = [
  { label: '小月（香港女声，粤语）', value: 'x3_xiaoyue' }
]

/**
 * 音频格式配置
 */
export const AUDIO_FORMAT_OPTIONS = [
  { label: 'PCM格式', value: 'raw', description: '未压缩音频格式，音质最佳' },
  { label: 'MP3格式', value: 'lame', description: '压缩音频格式，文件较小' },
  { label: 'WAV格式', value: 'speex-wb;7', description: 'Speex编码WAV格式' }
]

/**
 * 验证文本长度
 * @param {string} text - 要验证的文本
 * @param {number} maxLength - 最大长度，默认8000
 * @returns {boolean} 是否有效
 */
export function validateTextLength(text, maxLength = 8000) {
  return text && text.trim().length > 0 && text.length <= maxLength
}

/**
 * 计算预估音频时长（秒）
 * @param {string} text - 文本内容
 * @param {number} speed - 语速(0-100)
 * @returns {number} 预估时长（秒）
 */
export function estimateAudioDuration(text, speed = 50) {
  if (!text) return 0
  
  // 基础语速：每分钟约300字符
  const baseCharsPerMinute = 300
  
  // 根据语速调整
  const speedFactor = speed / 50 // 50为标准语速
  const charsPerMinute = baseCharsPerMinute * speedFactor
  
  // 计算时长（分钟）
  const durationMinutes = text.length / charsPerMinute
  
  // 转换为秒并添加一些缓冲时间
  return Math.ceil(durationMinutes * 60 * 1.2)
}

/**
 * WebSocket连接状态
 */
export const WS_STATUS = {
  CONNECTING: 'connecting',
  CONNECTED: 'connected',
  SYNTHESIZING: 'synthesizing',
  COMPLETED: 'completed',
  ERROR: 'error',
  CLOSED: 'closed'
}

/**
 * 错误代码映射
 */
export const ERROR_CODES = {
  10001: 'API调用次数超限',
  10002: '无效的API密钥',
  10003: '参数格式错误',
  10004: '用户权限不足',
  10005: '应用未开通相关能力',
  10006: '音频编码格式错误',
  10007: '音频采样率错误',
  10008: '音频声道错误',
  10009: '发音人错误',
  10010: '文本长度超限',
  10011: '文本编码格式错误',
  10012: '文本内容为空',
  10013: '合成失败',
  10014: '引擎错误',
  10015: '网络错误',
  10016: '服务器内部错误'
}

/**
 * 获取错误信息
 * @param {number} code - 错误代码
 * @returns {string} 错误信息
 */
export function getErrorMessage(code) {
  return ERROR_CODES[code] || `未知错误（代码：${code}）`
} 